#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<vector>
#include<string>
using namespace std;
int num=10;
//试一试多线程
void* thread_func(void* arg)
{
    sleep(1);
    cout<<"我是线程："<<(const char*)arg<<endl;
    delete[] (char*)arg;
    return nullptr;
}
int main()
{
    vector<pthread_t>tids;
    for(int i=0;i<num;i++)
    {
        char* buffer=new char[64];
        snprintf(buffer,sizeof(buffer),"thread-%d",i);
        //开始创建线程
        pthread_t tid;
        int n=pthread_create(&tid,nullptr,thread_func,(void*)buffer);
        tids.push_back(tid);
    }
    for(int i=0;i<num;i++)
    {
        //把线程等待
        pthread_join(tids[i],nullptr);
    }
    return 0;
}













//pthread_creat中的参数还可以为类
// class task
// {
// public:
//     task(int a,int b)
//     :_a(a)
//     ,_b(b)
//     {}
//     int execute()
//     {
//         return _a*_b;
//     }
//     ~task()
//     {}
// private:
//     int _a;
//     int _b;
// };
// class result
// {
// public:
//     result(int r)
//     :_result(r)
//     {}
//     int getresult()
//     {
//         return _result;
//     }
//     ~result()
//     {}
// private:
//     int _result;
// };
// void* routine(void* arg)
// {
//     task* t=(task*)arg;
//     result* r= new result(t->execute());
//     return r;
// }
// int main()
// {
//     pthread_t tid;
//     task t(2,3);
//     pthread_create(&tid,nullptr,routine,&t);
//     result* ret;
//     pthread_join(tid,(void**)&ret);
//     cout<<"线程返回的结果是:"<<ret->getresult()<<endl;
//     return 0;
// }



















// void* routine(void* arg)
// {
//     pthread_detach(pthread_self());//该线程自动把自己解绑
//     int cnt=3;
//     while(cnt--)
//     {
//         sleep(1);
//         cout<<"我是一个新进程,我的名字是："<<(const char*)arg<<endl;
//     }
//     return (void*)10;
// }
// int main()
// {
//     pthread_t tid;
//     int n=pthread_create(&tid,nullptr,routine,(void*)"thread-1");
//     if(n!=0)
//     {
//         cout<<"创建线程失败！"<<endl;
//         return 1;
//     }
//     //将新线程给cancel
//     //pthread_cancel(tid);//返回值为-1，即PTHREAD_CANCELLED
//     void* ret=nullptr;
//     int n2=pthread_join(tid,&ret);
//     if(n2!=0)
//     {
//         cout<<"等待线程失败！"<<endl;
//         return 1;
//     }
//     cout<<"线程退出的返回值是:"<<(long long)ret<<endl;
//     return 0;
// }

















// void* routine(void* arg)
// {
//     int cnt=3;
//     while(cnt--)
//     {
//         sleep(1);
//         cout<<"我是一个新进程,我的名字是："<<(const char*)arg<<endl;
//     }
//     //下面这句代码会导致整个进程崩溃
//     int a=10;
//     a/=0;//任何一个线程一旦退出其他线程都会跟着退出,最后整个进程崩溃
//     return nullptr;
// }
// int main()
// {
//     //创建一个新的线程
//     pthread_t tid;
//     int n=pthread_create(&tid,nullptr,routine,(void*)"thread-1");
//     if(n!=0)
//     {
//         cout<<"创建线程失败！"<<endl;
//         return 1;
//     }
//     //这里是main线程
//     int cnt=5;
//     while(cnt--)
//     {
//         sleep(1);
//         cout<<"我是主线程"<<endl;
//     }
//     //只要这新线程没有被detach,那么新线程的资源就不会被自动释放，所以我们需要手动等待
//     pthread_join(tid,nullptr);
//     return 0;
// }